home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d939.lha / ExtraCmds / source_etc.lha / src / TestBits.c < prev    next >
C/C++ Source or Header  |  1993-10-22  |  5KB  |  175 lines

  1. /*   ---------------------------------      -------     
  2.  *   |\  | | | | |  |.| |   \|  |/ /|\      |||||||     
  3.  *   | | | |/  | |\ |/  |/|  |\ |/  |    ?  ---+---  =< 
  4.  *   | | | |   | |  |     |  |  |   |     \qqqqqqqqq/   
  5.  *   ---------------------------------  ~~~~~~~~~~~~~~~~
  6.  *  TestBits - tests whether one or more protection flags are set.
  7.  *  Copyright (C) 1993 Torsten Poulin
  8.  *
  9.  *  This program is free software; you can redistribute it and/or modify
  10.  *  it under the terms of the GNU General Public License as published by
  11.  *  the Free Software Foundation; either version 2 of the License, or
  12.  *  (at your option) any later version.
  13.  *
  14.  *  This program is distributed in the hope that it will be useful,
  15.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  *  GNU General Public License for more details.
  18.  *
  19.  *  You should have received a copy of the GNU General Public License
  20.  *  along with this program; if not, write to the Free Software
  21.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  *
  23.  *  The author can be contacted by s-mail at
  24.  *    Torsten Poulin
  25.  *    Banebrinken 99, 2, 77
  26.  *    DK-2400 Copenhagen NV
  27.  *    DENMARK
  28.  *
  29.  * $Id: TestBits.c,v 37.1 93/03/11 17:33:47 Torsten Rel $
  30.  * $Log:    TestBits.c,v $
  31.  * Revision 37.1  93/03/11  17:33:47  Torsten
  32.  * Initial revision.
  33.  * 
  34.  */
  35.  
  36. #include <exec/types.h>
  37. #include <exec/memory.h>
  38. #include <dos/dos.h>
  39. #include <dos/dosasl.h>
  40. #include <clib/dos_protos.h>
  41. #include <clib/exec_protos.h>
  42. #ifdef __SASC
  43. #include <pragmas/dos_pragmas.h>
  44. #include <pragmas/exec_pragmas.h>
  45. #endif
  46. #include "tastlib.h"
  47. #include "testbits_rev.h"
  48.  
  49. #define PROGNAME "TestBits"
  50. #define TEMPLATE "NAME/A,FLAGS/A"
  51. #define OPT_NAME  0
  52. #define OPT_FLAGS 1
  53.  
  54. char const versionID[] = VERSTAG;
  55. char const copyright[] = "$COPYRIGHT:Copyright © 1993 Torsten Poulin$";
  56.  
  57. typedef struct {
  58.   struct DosLibrary *DOSBase;
  59.   struct FileInfoBlock fib;
  60. } Global;
  61.  
  62. LONG setbit(UBYTE c, LONG *mask, Global *global);
  63. LONG matchflags(UBYTE *name, UBYTE *flags, Global *global);
  64.  
  65.  
  66. LONG entrypoint(VOID)
  67. {
  68.   struct DosLibrary *DOSBase;
  69.   struct RDArgs *args;
  70.   Global *global;
  71.   LONG arg[2];
  72.   LONG rc = RETURN_OK;
  73.  
  74.   if (!(DOSBase = (struct DosLibrary *) OpenLibrary("dos.library", 37L)))
  75.     return RETURN_FAIL;
  76.  
  77.   if (!(global = AllocVec(sizeof(Global), MEMF_PUBLIC | MEMF_CLEAR)))
  78.     rc = ERROR_NO_FREE_STORE;
  79.   else
  80.   {
  81.     global->DOSBase = DOSBase;
  82.  
  83.     arg[OPT_NAME] = arg[OPT_FLAGS] = 0L;
  84.     
  85.     if (!(args = ReadArgs(TEMPLATE, arg, NULL)))
  86.       rc = RETURN_ERROR;
  87.     else
  88.     {
  89.       rc = matchflags((UBYTE *) arg[OPT_NAME],
  90.               (UBYTE *) arg[OPT_FLAGS], global);
  91.       FreeArgs(args);
  92.     }
  93.     FreeVec(global);
  94.   }
  95.   rc = printErrorMsg(rc, PROGNAME, DOSBase);
  96.   CloseLibrary((struct Library *) DOSBase);
  97.   return rc;
  98. }
  99.  
  100.  
  101. LONG matchflags(UBYTE *name, UBYTE *flags, Global *global)
  102. {
  103.   struct DosLibrary *DOSBase = global->DOSBase;
  104.   LONG setmask = 0L;
  105.   LONG unsetmask = 0L;
  106.   LONG bits = 0L;
  107.   BPTR lock;
  108.   LONG rc = RETURN_OK;
  109.  
  110.   for (; *flags; flags++)
  111.   {
  112.     if (*flags == '-')
  113.     {
  114.       if (*++flags)
  115.     rc = setbit(*flags, &unsetmask, global);
  116.       /* Silently ignore a trailing '-' */ 
  117.     }
  118.     else
  119.       rc = setbit(*flags, &setmask, global);
  120.   }
  121.  
  122.   if (rc == RETURN_OK)
  123.   {
  124.     if (setmask & unsetmask)
  125.     {
  126.       MyPrintf(global, "%s: Ambiguous flag specification\n", PROGNAME);
  127.       rc = RETURN_ERROR;
  128.     }
  129.     else
  130.     {
  131.       if (!(lock = Lock(name, SHARED_LOCK)))
  132.     rc = RETURN_ERROR;
  133.       else
  134.       {
  135.     if (!Examine(lock, &global->fib))
  136.     {
  137.       MyPrintf(global, "%s: Cannot examine \"%s\"\n", PROGNAME, name);
  138.       rc = RETURN_ERROR;
  139.     }
  140.     else        
  141.     {
  142.       bits = global->fib.fib_Protection;
  143.       /* Flip the lower 4 bits and get rid of the higher 24... */
  144.       bits = (~bits & 0x0000000f) | (bits & 0x000000f0);
  145.       rc = ((bits & setmask) == setmask && (bits & unsetmask) == 0L
  146.         ? RETURN_OK
  147.         : RETURN_WARN);
  148.     }
  149.     UnLock(lock);
  150.       }
  151.     }
  152.   }
  153.   return rc;
  154. }
  155.  
  156.  
  157. LONG setbit(UBYTE c, LONG *mask, Global *global)
  158. {
  159.   c |= 0x20; /* to lower case (ought to be: c = tolower(c); */
  160.   switch (c)
  161.   {
  162.   case 's': *mask |= FIBF_SCRIPT;  break;
  163.   case 'p': *mask |= FIBF_PURE;    break;
  164.   case 'a': *mask |= FIBF_ARCHIVE; break;
  165.   case 'r': *mask |= FIBF_READ;    break;
  166.   case 'w': *mask |= FIBF_WRITE;   break;
  167.   case 'e': *mask |= FIBF_EXECUTE; break;
  168.   case 'd': *mask |= FIBF_DELETE;  break;
  169.   default:
  170.     MyPrintf(global, "%s: Unknown protection flag\n", PROGNAME);
  171.     return RETURN_ERROR;
  172.   }
  173.   return RETURN_OK;
  174. }
  175.